LifeGame Python
使用 Python 和 Pygame 实现生命游戏
0. 教学目标
通过本实验,学习:
使用 二维数组表示离散网格世界
理解并实现 生命游戏的局部规则 → 全局演化
使用 Pygame 进行基础的二维图形显示
使用 键盘事件控制程序行为
将一个问题分解为:
数据结构 → 规则函数 → 显示函数 → 主循环
1. 什么是生命游戏(Conway’s Game of Life)
生命游戏是一个离散、确定性、无随机的元胞自动机:
空间:二维网格
时间:离散时间步
每个格子(细胞)只有两种状态:
活 (1)死 (0)
1.1 演化规则(只依赖局部)
对每个细胞,统计它周围 8 个邻居 中活细胞的数量:
| 当前状态 | 活邻居数 | 下一状态 |
|---|---|---|
| 活 | 2 或 3 | 活 |
| 活 | 其他 | 死 |
| 死 | 3 | 活 |
| 死 | 其他 | 死 |
重要思想:
全局复杂行为来自简单的局部规则
2. 程序整体结构设计
在开始写代码前,先规划模块结构:
1 | 生命游戏程序 |
3. 第一步:准备环境和基本参数
3.1 安装并导入库
1 | pip install pygame |
1 | import pygame |
3.2 定义网格和显示参数
1 | CELL_SIZE = 10 # 每个细胞在屏幕上的像素大小 |
解释:
我们的“世界”是逻辑网格
Pygame 显示的是像素
一个细胞 ↔ 一个矩形
3.3 定义细胞状态和颜色
1 | ALIVE = 1 |
4. 第二步:用二维数组表示生命世界
4.1 二维数组的含义
1 | grid[y][x] |
y:第几行x:第几列值:
0或1
4.2 随机初始化网格
1 | def random_grid(): |
更优雅的写法:
1 | def random_grid(): |
教学要点:
外层列表 → 行
内层列表 → 列
每个位置随机赋值
5. 第三步:统计邻居数量(核心逻辑之一)
5.1 邻域定义
每个细胞有 8 个邻居:
1 | (-1,-1) (0,-1) (1,-1) |
5.2 邻居统计函数
1 | def count_neighbors(grid, x, y): |
逐行解释:
两层循环遍历 3×3 区域
排除自身
检查是否越界
累加存活细胞数
6. 第四步:计算下一代网格
6.1 为什么不能原地修改?
当前状态 → 决定下一状态
如果边算边改,会影响后续计算
解决方案:
使用一个新的二维数组
6.2 下一代计算函数
1 | def next_generation(grid): |
教学重点:
规则直接翻译成代码
清晰的 if / else 逻辑
新旧网格分离
7. 第五步:使用 Pygame 显示网格
7.1 显示原理
一个细胞 → 一个矩形
坐标换算:
1 | 屏幕 x = 网格列 * CELL_SIZE |
7.2 绘制函数
1 | def draw_grid(screen, grid): |
7.3 (可选)绘制网格线
1 | for x in range(GRID_WIDTH): |
8. 第六步:主循环与键盘控制
8.1 Pygame 程序基本结构
1 | pygame.init() |
8.2 事件处理与主循环
1 | grid = random_grid() |
教学重点:
SPACE:推进一代
R:重新初始化
ESC:退出
9. 总结:完整程序的思想
二维数组 = 世界状态
局部规则 → 全局演化
显示逻辑与计算逻辑分离
主循环 = 事件 + 更新 + 绘制
完整程序:
1 | import pygame |

